package com.pocket.demo.core.i18n;

import org.springframework.boot.autoconfigure.context.MessageSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.util.StringUtils;

import java.time.Duration;

/**
 * i18n 配置类【demo-i18n-1.2】
 **/
@Configuration
public class I18NConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.messages")
    public MessageSourceProperties messageSourceProperties() {
        return new MessageSourceProperties();
    }

    /**
     * springboot 的自动配置类：{@link org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration}
     *   如果自定义 MessageSource 其名称一定要为 messageSource，不然 springboot 会在创建一次
     *   其原因是 spring 容器在 refresh() 调用的 {@link org.springframework.context.support.AbstractApplicationContext#initMessageSource} 写死了 messageSource。
     * @param properties
     * @return
     */
    @Bean
    public MessageSource messageSource(MessageSourceProperties properties) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

        /**
         * 设置国际化配置文件路径，注意不包含【语言_国家.properties】；可指定多个，逗号分隔。如：i18n/messages,i18n/validate
         */
        if (StringUtils.hasText(properties.getBasename())) {
            messageSource.setBasenames(
                    StringUtils.commaDelimitedListToStringArray(
                            StringUtils.trimAllWhitespace(properties.getBasename())
                    )
            );
        }

        /**
         * 指定消息源文件的缓存时间（秒）
         *     cacheDuration = -1 ，永久缓存，不重新加载（默认）
         *     cacheDuration = 0，每次都会重新读取国际化文件
         *     cacheDuration > 0，间隔 cacheDuration 秒后，重新读取国际化文件
         */
        Duration cacheDuration = properties.getCacheDuration();
        if (cacheDuration != null) {
            messageSource.setCacheMillis(cacheDuration.toMillis());
        }

        /**
         * 兜底开关，默认找不到location，默认在messages.properties中找，找不到返回 null。
         * 设置为 true 时再兜底一次，从当前系统语言对应配置文件中查找。
         * 默认：true
         */
        messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
        /** 是否始终使用MessageFormat格式化消息。默认：false - 消息值中的占位符将被保留为原始字符串。 **/
        /**
         * 当调用 getMessage(String code, @Nullable Object[] args, Locale locale) 传入的 args 为空时，
         * 是否还调用 MessageFormat.format() 方法对消息进行格式化
         *    true: 总是格式化
         *    false: args为空不格式化（默认）
         */
        messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
        /**
         * 当找不到消息键code对应的value时，是否直接返回code
         *    true：直接返回code
         *    false：抛出异常 NoSuchMessageException（默认）
         */
        messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());

        if (properties.getEncoding() != null) {
            messageSource.setDefaultEncoding(properties.getEncoding().name());
        }

        return messageSource;
    }

}
